home *** CD-ROM | disk | FTP | other *** search
- {
- >Hi Greg; I tried this out a few minutes ago but it insists on
- >accessing COM1.
-
- Sorry about that. I should have used a single global CONSTant for
- the COM port number. I made the change, so now you just need to
- have "COMx = 2" for COM2.
-
- This code is a quick'n-dirty example, so I'm certain that there
- are errors/bugs in the COM i/o error checking. I'll take another
- look at it later...
- }
-
- PROGRAM UseInt14;
- USES Dos, Crt;
-
- CONST COMx = 1; { <<-- 1 for COM1, 2 for COM2, etc. }
-
- VAR reg : Registers; { CPU registers }
- Okay : BOOLEAN;
- ch : CHAR; { i/o character }
-
- PROCEDURE InitCOM (PortNo,Baud,WordLen,Parity,Stops:WORD);
- VAR IniParm:BYTE; BEGIN
- IniParm := 0;
- CASE Baud OF
- 300 : IniParm := 64;
- 1200 : IniParm := 128;
- 2400 : IniParm := 160;
- 4800 : IniParm := 192;
- 9600 : IniParm := 224;
- END{CASE};
- CASE Parity OF
- 1 : {odd} IniParm := IniParm OR 8;
- 2 : {none} ;
- 3 : {even} IniParm := IniParm OR 24;
- END{CASE};
- CASE Stops OF
- 2 : IniParm := IniParm OR 4;
- ELSE ;
- END{CASE};
- CASE WordLen OF
- 7 : IniParm := IniParm OR 2;
- 8 : IniParm := IniParm OR 3;
- END{CASE};
- reg.DX := PortNo - 1;; reg.AL := IniParm;;
- reg.AH := 0;; Intr($14,reg);
- END {InitCOM};
-
- PROCEDURE PutComChar (PortNo:WORD; Data:CHAR); BEGIN
- reg.DX := PortNo - 1;; reg.AL := ORD(Data);;
- reg.AH := 1;; Intr($14,reg);
- Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
- END {PutComChar};
-
- PROCEDURE GetComChar (PortNo:WORD; VAR Data:CHAR); BEGIN
- reg.DX := PortNo - 1;; reg.AH := 2;; Intr($14,reg);;
- Data := CHR(reg.AL);
- Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
- END {GetComChar};
-
- FUNCTION ComReady (PortNo:WORD):BOOLEAN; BEGIN
- reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
- Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
- ComReady := (reg.AH AND 96) <> 0;
- END {ComReady};
-
- FUNCTION ComDataAvailable (PortNo:WORD):BOOLEAN; BEGIN
- reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
- Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
- ComDataAvailable := (reg.AH AND 1) <> 0;
- END {ComDataAvailable};
-
- BEGIN {UseInt14}
- InitCOM (COMx,9600,8,2,1); { initialize COMx: 9600 bps, 8n1 }
- REPEAT
- IF ComDataAvailable(COMx) THEN GetComChar(COMx,ch) ELSE ch := #0;
- IF (ch <> #0) THEN Write (ch);
- IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
- IF KeyPressed THEN ch := ReadKey ELSE ch := #0;
- IF (ch <> #0) THEN BEGIN
- REPEAT {wait} UNTIL ComReady(COMx);
- PutComChar(COMx,ch);
- END{IF};
- IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
- UNTIL ch = #27; { exit when ESC key pressed }
-
- END {UseInt14}.